import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

public class Construcoes {
	
	int tipo, X, Y, largura, altura, raio, raioAtaque;
	
	BufferedImage img;
	
	boolean estaSelecionado, isAlive = false;
	
	Botao botaoCriaAldeao, botaoCriaSoldado, botaoCriaCavaleiro, botaoCriaArqueiro,
		botaoCriaBarco;
	
	boolean ehAliado = true;
	
	boolean vivo = true;
	
	float tirotimer = 0;
	
	int vida = 100;
	
	public Construcoes(int x,int y,BufferedImage img, int tipo){
		this.tipo = tipo;
		this.X = x;
		this.Y = y;
		this.img = img;
		this.raio = 10;
		this.raioAtaque = 0;
		
		
		
		switch (tipo){
		case 1 :
			this.largura = 64; 
			this.altura = 64;
			this.botaoCriaAldeao = new Botao
			(CanvasPrincipal.instance.botaoCriaAldeao,
					this.X+this.largura, this.Y+this.altura, 50, 50);
			this.vida = 5000;
			break;
		//construcao inimigo
		case 1+6 :
				this.largura = 64; 
				this.altura = 64;
				this.botaoCriaAldeao = new Botao
				(CanvasPrincipal.instance.botaoCriaAldeao,
						this.X+this.largura, this.Y+this.altura, 50, 50);
				this.vida = 5000;
				break;
			
		case 2 :
			this.largura = 64/2; 
			this.altura = 64/2;
			this.vida = 500;
			break;
			
		//construcao inimigo
		case 2+6 :
			this.largura = 64/2; 
			this.altura = 64/2;
			this.vida = 500;
			break;

		case 3 :
			this.largura = 64; 
			this.altura = 64;
			this.vida = 3000;
			this.botaoCriaSoldado = new Botao
			(CanvasPrincipal.instance.botaoCriaGuerreiro,
					this.X+this.largura, this.Y+this.altura, 50, 50);
			this.botaoCriaArqueiro = new Botao
			(CanvasPrincipal.instance.botaoCriaArqueiro,
					this.X+this.largura+50, this.Y+this.altura, 50, 50);
			this.botaoCriaCavaleiro = new Botao
			(CanvasPrincipal.instance.botaoCriaCavaleiro,
					this.X+this.largura+100, this.Y+this.altura, 50, 50);
			break;
		
		//construcao inimigo
		case 3+6 :
			this.largura = 64; 
			this.altura = 64;
			this.vida = 3000;
			this.botaoCriaSoldado = new Botao
			(CanvasPrincipal.instance.botaoCriaGuerreiro,
					this.X+this.largura, this.Y+this.altura, 50, 50);
			this.botaoCriaArqueiro = new Botao
			(CanvasPrincipal.instance.botaoCriaArqueiro,
					this.X+this.largura+50, this.Y+this.altura, 50, 50);
			this.botaoCriaCavaleiro = new Botao
			(CanvasPrincipal.instance.botaoCriaCavaleiro,
					this.X+this.largura+100, this.Y+this.altura, 50, 50);
			break;

		case 4 :
			this.largura = 64/2; 
			this.altura = 64/2;
			this.vida = 3000;
			break;
			
		//construcao inimigo
		case 4+6 :
			this.largura = 64/2; 
			this.altura = 64/2;
			this.vida = 3000;
			break;


		case 5 :
			this.largura = 64/2; 
			this.altura = 64;
			this.raioAtaque = 300;
			this.vida = 1000;
			break;
		
		//construcao inimigo
		case 5+6 :
			this.largura = 64/2; 
			this.altura = 64;
			this.raioAtaque = 300;
			this.vida = 1000;
			break;

		case 6 :
			this.largura = 64; 
			this.altura = 64;
			this.botaoCriaBarco = new Botao
			(CanvasPrincipal.instance.botaoCriaBarco,
					this.X+this.largura, this.Y+this.altura, 50, 50);
			this.vida = 3000;
			break;
		
		//contrucao inimigo
		case 6+6 :
		this.largura = 64; 
		this.altura = 64;
		this.botaoCriaBarco = new Botao
		(CanvasPrincipal.instance.botaoCriaBarco,
				this.X+this.largura, this.Y+this.altura, 50, 50);
		this.vida = 3000;
		break;
	}
		 
	}

	public void simulaSe(int diftime){
		
		switch (tipo){
		case 1 :
			simulaCidade(diftime);
			break;

		case 2 :
			simulaCasa(diftime);
			break;

		case 3 :
			simulaQuartel(diftime);
			break;

		case 4 :
			simulaDeposito(diftime);
			break;

		case 5 :
			simulaTorre(diftime);
			break;

		case 6 :
			simulaCais(diftime);
			break;
		
		case 7 :
			simulaCidade(diftime);
			break;
	
		case 8 :
			simulaCasa(diftime);
			break;
	
		case 9 :
			simulaQuartel(diftime);
			break;
	
		case 10 :
			simulaDeposito(diftime);
			break;
	
		case 11 :
			simulaTorre(diftime);
			break;
	
		case 12 :
			simulaCais(diftime);
			break;
		}
	
	}

	private void simulaCais(int diftime) {
		// TODO Auto-generated method stub
		
		if(this.estaSelecionado)
		botaoCriaBarco.SimulaSe(diftime);
		
		if(this.estaSelecionado)
		if(botaoCriaBarco.isbAction()){
			botaoCriaBarco.setbAction(false);
			Personagem pers = new Personagem(X,
					Y+largura,
					CanvasPrincipal.instance.charsets[5],
					32,
					48);
			CanvasPrincipal.instance.ListaDePersonagensJogador.add(pers);
			pers.vivo = true;
			pers.codPersonagem = 5;
			pers.anim = 0;
			pers.vel = 50;
			pers.setSelecaoX(X+largura*2);
			pers.setSelecaoY(Y+altura*2);
		}
	}

	private void simulaTorre(int diftime) {
		// TODO Auto-generated method stub
		
		
		tirotimer +=diftime;
		
		if(this.tipo < 6 )
		for(int i = 0; i<CanvasPrincipal.instance.ListaDePersonagensInimigo.size(); i++){
			Personagem pers = (Personagem)CanvasPrincipal.instance.ListaDePersonagensInimigo.get(i);
			
			//aliados
			if(this.tipo < 6 )
			if(torreTestaColisaoCircular(pers)){
				if((!(pers.codPersonagem<6))){
					if(tirotimer>500){
						float xtela = X-CanvasPrincipal.mapa.mapX;
						float ytela = Y-CanvasPrincipal.mapa.mapY;

						float dx = pers.X - xtela;
						float dy = pers.Y - ytela;

						double ang = Math.atan2(dy, dx);

						double vx = 800*Math.cos(ang);
						double vy = 800*Math.sin(ang);

						Projetil bala = new Projetil(X,Y,(int)vx, (int)vy,this);
						CanvasPrincipal.instance.ListaDeProjeteis.add(bala);
						tirotimer = 0;
					}
				}
			}
		}	
			//inimigos
		if(this.tipo >= 6 )
		for(int i = 0; i<CanvasPrincipal.instance.ListaDePersonagensJogador.size(); i++){
				Personagem pers = (Personagem)CanvasPrincipal.instance.ListaDePersonagensJogador.get(i);
			if(this.tipo >= 6 )
				if(torreTestaColisaoCircular(pers)){
					if(!(pers.codPersonagem>=6)){
						if(tirotimer>800){
							float xtela = X-CanvasPrincipal.mapa.mapX;
							float ytela = Y-CanvasPrincipal.mapa.mapY;

							float dx = pers.X - xtela;
							float dy = pers.Y - ytela;

							double ang = Math.atan2(dy, dx);

							double vx = 800*Math.cos(ang);
							double vy = 800*Math.sin(ang);

							Projetil bala = new Projetil(X,Y,(int)vx, (int)vy,this);
							CanvasPrincipal.instance.ListaDeProjeteis.add(bala);
							tirotimer = 0;
						}
				}
			}
		}
	}

	private void simulaDeposito(int diftime) {
		// TODO Auto-generated method stub
		
	}

	private void simulaQuartel(int diftime) {
		// TODO Auto-generated method stub
		if(this.estaSelecionado)
		botaoCriaSoldado.SimulaSe(diftime);
		if(this.estaSelecionado)
		if(botaoCriaSoldado.isbAction()){
			botaoCriaSoldado.setbAction(false);
			
			Personagem pers = new Personagem(X,
					Y+largura,
					CanvasPrincipal.instance.charsets[3],
					32,
					48);
			CanvasPrincipal.instance.ListaDePersonagensJogador.add(pers);
			pers.vivo = true;
			pers.codPersonagem = 4;
			pers.anim = 0;
			pers.vel = 50;
			pers.setSelecaoX(X+largura*2);
			pers.setSelecaoY(Y+altura*2);
			
		}
		
		botaoCriaCavaleiro.SimulaSe(diftime);
		
		if(botaoCriaCavaleiro.isbAction()){
			botaoCriaCavaleiro.setbAction(false);
			Personagem pers = new Personagem(X,
					Y+largura,
					CanvasPrincipal.instance.charsets[2],
					32,
					48);
			CanvasPrincipal.instance.ListaDePersonagensJogador.add(pers);
			pers.vivo = true;
			pers.codPersonagem = 3;
			pers.anim = 0;
			pers.vel = 50;
			pers.setSelecaoX(X+largura*2);
			pers.setSelecaoY(Y+altura*2);
			CanvasPrincipal.humano.alimento -= 20;
			CanvasPrincipal.humano.ouro -= 50;
		}
		
		botaoCriaArqueiro.SimulaSe(diftime);
		
		if(botaoCriaArqueiro.isbAction()){
			botaoCriaArqueiro.setbAction(false);
			Personagem pers = new Personagem(X,
					Y+largura,
					CanvasPrincipal.instance.charsets[1],
					32,
					48);
			CanvasPrincipal.instance.ListaDePersonagensJogador.add(pers);
			pers.vivo = true;
			pers.codPersonagem = 1;
			pers.anim = 0;
			pers.vel = 50;
			pers.setSelecaoX(X+largura*2);
			pers.setSelecaoY(Y+altura*2);
			CanvasPrincipal.humano.alimento -= 10;
			CanvasPrincipal.humano.madeira -= 20;
		}
	}

	private void simulaCasa(int diftime) {
		// TODO Auto-generated method stub
		
	}

	private void simulaCidade(int diftime) {
		// TODO Auto-generated method stub
		
		if(this.estaSelecionado)
		botaoCriaAldeao.SimulaSe(diftime);
		if(this.estaSelecionado)
		if(botaoCriaAldeao.isbAction()){
			botaoCriaAldeao.setbAction(false);
			Personagem pers = new Personagem(X,
					Y+largura,
					CanvasPrincipal.instance.charsets[0],
					32,
					48);
			CanvasPrincipal.instance.ListaDePersonagensJogador.add(pers);
			pers.vivo = true;
			pers.codPersonagem = 0;
			pers.anim = 0;
			pers.vel = 50;
			pers.setSelecaoX(X+largura*2);
			pers.setSelecaoY(Y+altura*2);
			pers.botaoCriaCasa = new Botao
			(CanvasPrincipal.instance.botaoCriaCasa, 100, 500, 50, 50);
		}
		
	}

	public void desenhaSe(Graphics2D dbg,int xmundo,int ymundo){
		
		if(estaSelecionado){
			
			//desenha circulo de selecao
			dbg.setColor(Color.RED);
			dbg.drawRect(X-xmundo, Y-ymundo, largura, altura);
			//dbg.drawOval(((int)X-xmundo)-raio, ((int)Y-ymundo)-raio, raio*2, raio*2);
			dbg.setColor(Color.YELLOW);
			dbg.drawRect(X-xmundo, Y-ymundo, largura+1, altura+1);
			//dbg.drawOval(((int)X-xmundo)-raio-1, ((int)Y-ymundo)-raio-1, raio*2, raio*2);
			dbg.setColor(Color.GREEN);
			dbg.drawRect(X-xmundo, Y-ymundo, largura-1, altura-1);
			//dbg.drawOval(((int)X-xmundo)-raio+1, ((int)Y-ymundo)-raio+1, raio*2, raio*2);
			
			//desenha life
			dbg.setColor(Color.GREEN);
			dbg.fillRect(X,
					Y-10,
					(vida/64),
					10);
			dbg.setColor(Color.RED);
			dbg.drawRect(X,
					Y-10,
					(vida/64),
					10);
			
		}
		
		switch (tipo){
		case 1 :
			desenhaCidade(dbg, xmundo, ymundo);
			break;

		case 2 :
			desenhaCasa(dbg, xmundo, ymundo);
			break;

		case 3 :
			desenhaQuartel(dbg, xmundo, ymundo);
			break;

		case 4 :
			desenhaDeposito(dbg, xmundo, ymundo);
			break;

		case 5 :
			desenhaTorre(dbg, xmundo, ymundo);
			break;

		case 6 :
			desenhaCais(dbg, xmundo, ymundo);
			break;
			
		case 7 :
			desenhaCidade(dbg, xmundo, ymundo);
			break;

		case 8 :
			desenhaCasa(dbg, xmundo, ymundo);
			break;

		case 9 :
			desenhaQuartel(dbg, xmundo, ymundo);
			break;

		case 10 :
			desenhaDeposito(dbg, xmundo, ymundo);
			break;

		case 11 :
			desenhaTorre(dbg, xmundo, ymundo);
			break;

		case 12 :
			desenhaCais(dbg, xmundo, ymundo);
			break;
		
		}

	}

	private void desenhaCais(Graphics2D dbg,int xmundo,int ymundo) {
		// TODO Auto-generated method stub
		int L = 64; int A = 64;int x = 192;int y=0;
		if(tipo > 6) y+=64;

		dbg.drawImage(img, ((int)X-xmundo),
				((int)Y-ymundo),
				(int)(X-xmundo+L),
				(int)(Y-ymundo+A),
				x,
				y,
				x+L,
				y+A,null);
		
		if(estaSelecionado){	
			botaoCriaBarco.DesenhaSe(dbg, xmundo, ymundo);
		}
	}

	private void desenhaTorre(Graphics2D dbg,int xmundo,int ymundo) {
		// TODO Auto-generated method stub
		int L = 64/2; int A = 64;int x = 288;int y=0;
		if(tipo > 6) {y+=64;}

		dbg.drawImage(img, ((int)X-xmundo),
				((int)Y-ymundo),
				(int)(X-xmundo+L),
				(int)(Y-ymundo+A),
				x-L,
				y,
				x-L+L,
				y+A,null);
		
		if(estaSelecionado){
			dbg.setColor(Color.RED);
			dbg.drawOval(((int)X+largura/2-xmundo)-raioAtaque,
					((int)Y+altura/2-ymundo)-raioAtaque,
					raioAtaque*2, raioAtaque*2);
		}
	}

	private void desenhaDeposito(Graphics2D dbg,int xmundo,int ymundo) {
		// TODO Auto-generated method stub
		int L = 64/2; int A = 64/2;int x = 288;int y=32;
		if(tipo > 6) {y+=64;}

		dbg.drawImage(img, ((int)X-xmundo),
				((int)Y-ymundo),
				(int)(X-xmundo+L),
				(int)(Y-ymundo+A),
				x,
				y,
				x+L,
				y+A,null);
	}

	private void desenhaQuartel(Graphics2D dbg,int xmundo,int ymundo) {
		// TODO Auto-generated method stub
		int L = 64; int A = 64;int x = 128;int y=0;
		if(tipo > 6) {y+=64;}

		dbg.drawImage(img, ((int)X-xmundo),
				((int)Y-ymundo),
				(int)(X-xmundo+L),
				(int)(Y-ymundo+A),
				x,
				y,
				x+L,
				y+A,null);
		
		if(estaSelecionado){		
			botaoCriaSoldado.DesenhaSe(dbg, xmundo, ymundo);
			botaoCriaArqueiro.DesenhaSe(dbg, xmundo, ymundo);
			botaoCriaCavaleiro.DesenhaSe(dbg, xmundo, ymundo);
		}
	}

	private void desenhaCasa(Graphics2D dbg,int xmundo,int ymundo) {
		// TODO Auto-generated method stub
		int L = 64/2; int A = 64/2;int x = 288;int y=0;
		if(tipo > 6) {A+=0;y+=64;}

		dbg.drawImage(img, ((int)X-xmundo),
				((int)Y-ymundo),
				(int)(X-xmundo+L),
				(int)(Y-ymundo+A),
				x,
				y,
				x+L,
				y+A,null);
	}

	private void desenhaCidade(Graphics2D dbg,int xmundo,int ymundo) {
		// TODO Auto-generated method stub
		
		int L = 64; int A = 64;int x = 0;int y=0;
		if(tipo > 6) {A+=64;y+=64;}
		
		dbg.drawImage(img,
				((int)X-xmundo),
				((int)Y-ymundo),
				(int)(X-xmundo+L),
				(int)(Y-ymundo+A),
				(x),
				(y),
				(x)+L,
				(y)+A,null);
		
		if(estaSelecionado){
			
			botaoCriaAldeao.DesenhaSe(dbg, xmundo, ymundo);
		}
	}
	
	public boolean torreTestaColisaoCircular(Personagem p1){
		float dx = p1.X - X+largura/2;
		float dy = p1.Y - Y+altura/2;
		float d2 = dx*dx + dy*dy;
		float rsoma = (raioAtaque+p1.raio); 
		
		if(d2<(rsoma*rsoma)){
			return true;
		}
		return false;
	}
	
	public void levadano(int dano){
		vida-=dano;
		if(vida<=0){
			vivo = false;
		}
	}
}

